home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / doom / quake.zip / QVOTE22.ZIP / WEAPONS.QC < prev   
Text File  |  1996-08-02  |  26KB  |  1,244 lines

  1. void (entity targ, entity inflictor, entity attacker, float damage) T_Damage;
  2. void () player_run;
  3. void(entity bomb, entity attacker, float rad, entity ignore) T_RadiusDamage;
  4. void(vector org, vector vel, float damage) SpawnBlood;
  5. void() SuperDamageSound;
  6.  
  7.  
  8. // called by worldspawn
  9. void() W_Precache =
  10. {
  11.     precache_sound ("weapons/r_exp3.wav");    // new rocket explosion
  12.     precache_sound ("weapons/rocket1i.wav");    // spike gun
  13.     precache_sound ("weapons/sgun1.wav");
  14.     precache_sound ("weapons/guncock.wav");    // player shotgun
  15.     precache_sound ("weapons/ric1.wav");    // ricochet (used in c code)
  16.     precache_sound ("weapons/ric2.wav");    // ricochet (used in c code)
  17.     precache_sound ("weapons/ric3.wav");    // ricochet (used in c code)
  18.     precache_sound ("weapons/spike2.wav");    // super spikes
  19.     precache_sound ("weapons/tink1.wav");    // spikes tink (used in c code)
  20.     precache_sound ("weapons/grenade.wav");    // grenade launcher
  21.     precache_sound ("weapons/bounce.wav");        // grenade bounce
  22.     precache_sound ("weapons/shotgn2.wav");    // super shotgun
  23. };
  24.  
  25. float() crandom =
  26. {
  27.     return 2*(random() - 0.5);
  28. };
  29.  
  30. /*
  31. ================
  32. W_FireAxe
  33. ================
  34. */
  35. void() W_FireAxe =
  36. {
  37.     local    vector    source;
  38.     local    vector    org;
  39.  
  40.     source = self.origin + '0 0 16';
  41.     traceline (source, source + v_forward*64, FALSE, self);
  42.     if (trace_fraction == 1.0)
  43.         return;
  44.     
  45.     org = trace_endpos - v_forward*4;
  46.  
  47.     if (trace_ent.takedamage)
  48.     {
  49.         trace_ent.axhitme = 1;
  50.         SpawnBlood (org, '0 0 0', 20);
  51.         T_Damage (trace_ent, self, self, 20);
  52.     }
  53.     else
  54.     {    // hit wall
  55.         sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM);
  56.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  57.         WriteByte (MSG_BROADCAST, TE_GUNSHOT);
  58.         WriteCoord (MSG_BROADCAST, org_x);
  59.         WriteCoord (MSG_BROADCAST, org_y);
  60.         WriteCoord (MSG_BROADCAST, org_z);
  61.     }
  62. };
  63.  
  64.  
  65. //============================================================================
  66.  
  67.  
  68. vector() wall_velocity =
  69. {
  70.     local vector    vel;
  71.     
  72.     vel = normalize (self.velocity);
  73.     vel = normalize(vel + v_up*(random()- 0.5) + v_right*(random()- 0.5));
  74.     vel = vel + 2*trace_plane_normal;
  75.     vel = vel * 200;
  76.     
  77.     return vel;
  78. };
  79.  
  80.  
  81. /*
  82. ================
  83. SpawnMeatSpray
  84. ================
  85. */
  86. void(vector org, vector vel) SpawnMeatSpray =
  87. {
  88.     local    entity missile, mpuff;
  89.     local    vector    org;
  90.  
  91.     missile = spawn ();
  92.     missile.owner = self;
  93.     missile.movetype = MOVETYPE_BOUNCE;
  94.     missile.solid = SOLID_NOT;
  95.  
  96.     makevectors (self.angles);
  97.  
  98.     missile.velocity = vel;
  99.     missile.velocity_z = missile.velocity_z + 250 + 50*random();
  100.  
  101.     missile.avelocity = '3000 1000 2000';
  102.     
  103. // set missile duration
  104.     missile.nextthink = time + 1;
  105.     missile.think = SUB_Remove;
  106.  
  107.     setmodel (missile, "progs/zom_gib.mdl");
  108.     setsize (missile, '0 0 0', '0 0 0');        
  109.     setorigin (missile, org);
  110. };
  111.  
  112. /*
  113. ================
  114. SpawnBlood
  115. ================
  116. */
  117. void(vector org, vector vel, float damage) SpawnBlood =
  118. {
  119.         particle (org, vel*0.1, 75, damage);
  120.         particle (org, vel*0.1, 72, damage);
  121.         particle (org, vel*0.1, 73, damage*2); //org = damage*2 -kb
  122.         particle (org, vel*0.1, 74, damage);
  123.         particle (org, vel*0.1, 71, damage);
  124.  
  125. };                                             
  126.  
  127. /*
  128. ================
  129. spawn_touchblood
  130. ================
  131. */
  132. void(float damage) spawn_touchblood =
  133. {
  134.     local vector    vel;
  135.  
  136.     vel = wall_velocity () * 0.2;
  137.     SpawnBlood (self.origin + vel*0.01, vel, damage);
  138. };
  139.  
  140.  
  141. /*
  142. ================
  143. SpawnChunk
  144. ================
  145. */
  146. void(vector org, vector vel) SpawnChunk =
  147. {
  148.     particle (org, vel*0.02, 0, 10);
  149. };
  150.  
  151. /*
  152. ==============================================================================
  153.  
  154. MULTI-DAMAGE
  155.  
  156. Collects multiple small damages into a single damage
  157.  
  158. ==============================================================================
  159. */
  160.  
  161. entity    multi_ent;
  162. float    multi_damage;
  163.  
  164. void() ClearMultiDamage =
  165. {
  166.     multi_ent = world;
  167.     multi_damage = 0;
  168. };
  169.  
  170. void() ApplyMultiDamage =
  171. {
  172.     if (!multi_ent)
  173.         return;
  174.     T_Damage (multi_ent, self, self, multi_damage);
  175. };
  176.  
  177. void(entity hit, float damage) AddMultiDamage =
  178. {
  179.     if (!hit)
  180.         return;
  181.     
  182.     if (hit != multi_ent)
  183.     {
  184.         ApplyMultiDamage ();
  185.         multi_damage = damage;
  186.         multi_ent = hit;
  187.     }
  188.     else
  189.         multi_damage = multi_damage + damage;
  190. };
  191.  
  192. /*
  193. ==============================================================================
  194.  
  195. BULLETS
  196.  
  197. ==============================================================================
  198. */
  199.  
  200. /*
  201. ================
  202. TraceAttack
  203. ================
  204. */
  205. void(float damage, vector dir) TraceAttack =
  206. {
  207.     local    vector    vel, org;
  208.     
  209.     vel = normalize(dir + v_up*crandom() + v_right*crandom());
  210.     vel = vel + 2*trace_plane_normal;
  211.     vel = vel * 200;
  212.  
  213.     org = trace_endpos - dir*4;
  214.  
  215.     if (trace_ent.takedamage)
  216.     {
  217.                 SpawnBlood (org, vel*0.2, damage);
  218.         AddMultiDamage (trace_ent, damage);
  219.     }
  220.     else
  221.     {
  222.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  223.         WriteByte (MSG_BROADCAST, TE_GUNSHOT);
  224.         WriteCoord (MSG_BROADCAST, org_x);
  225.         WriteCoord (MSG_BROADCAST, org_y);
  226.         WriteCoord (MSG_BROADCAST, org_z);
  227.     }
  228. };
  229.  
  230. /*
  231. ================
  232. FireBullets
  233.  
  234. Used by shotgun, super shotgun, and enemy soldier firing
  235. Go to the trouble of combining multiple pellets into a single damage call.
  236. ================
  237. */
  238. void(float shotcount, vector dir, vector spread) FireBullets =
  239. {
  240.     local    vector direction;
  241.     local    vector    src;
  242.     
  243.     makevectors(self.v_angle);
  244.  
  245.     src = self.origin + v_forward*10;
  246.     src_z = self.absmin_z + self.size_z * 0.7;
  247.  
  248.     ClearMultiDamage ();
  249.     while (shotcount > 0)
  250.     {
  251.         direction = dir + crandom()*spread_x*v_right + crandom()*spread_y*v_up;
  252.  
  253.         traceline (src, src + direction*2048, FALSE, self);
  254.         if (trace_fraction != 1.0)
  255.             TraceAttack (4, direction);
  256.  
  257.         shotcount = shotcount - 1;
  258.     }
  259.     ApplyMultiDamage ();
  260. };
  261.  
  262. /*
  263. ================
  264. W_FireShotgun
  265. ================
  266. */
  267. void() W_FireShotgun =
  268. {
  269.     local vector dir;
  270.  
  271.     sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM);    
  272.  
  273.     self.punchangle_x = -2;
  274.     
  275.     self.currentammo = self.ammo_shells = self.ammo_shells - 1;
  276.     dir = aim (self, 100000);
  277.     FireBullets (6, dir, '0.04 0.04 0');
  278. };
  279.  
  280.  
  281. /*
  282. ================
  283. W_FireSuperShotgun
  284. ================
  285. */
  286. void() W_FireSuperShotgun =
  287. {
  288.     local vector dir;
  289.  
  290.     if (self.currentammo == 1)
  291.     {
  292.         W_FireShotgun ();
  293.         return;
  294.     }
  295.         
  296.     sound (self ,CHAN_WEAPON, "weapons/shotgn2.wav", 1, ATTN_NORM);    
  297.  
  298.     self.punchangle_x = -4;
  299.     
  300.     self.currentammo = self.ammo_shells = self.ammo_shells - 2;
  301.     dir = aim (self, 100000);
  302.     FireBullets (14, dir, '0.14 0.08 0');
  303. };
  304.  
  305.  
  306. /*
  307. ==============================================================================
  308.  
  309. ROCKETS
  310.  
  311. ==============================================================================
  312. */
  313.  
  314. void()    s_explode1    =    [0,        s_explode2] {};
  315. void()    s_explode2    =    [1,        s_explode3] {};
  316. void()    s_explode3    =    [2,        s_explode4] {};
  317. void()    s_explode4    =    [3,        s_explode5] {};
  318. void()    s_explode5    =    [4,        s_explode6] {};
  319. void()    s_explode6    =    [5,        SUB_Remove] {};
  320.  
  321. void() BecomeExplosion =
  322. {
  323.     self.movetype = MOVETYPE_NONE;
  324.     self.velocity = '0 0 0';
  325.     self.touch = SUB_Null;
  326.     setmodel (self, "progs/s_explod.spr");
  327.     self.solid = SOLID_NOT;
  328.     s_explode1 ();
  329. };
  330.  
  331. void() T_MissileTouch =
  332. {
  333.     local float    damg;
  334.  
  335.     if (other == self.owner)
  336.         return;        // don't explode on owner
  337.  
  338.     if (pointcontents(self.origin) == CONTENT_SKY)
  339.     {
  340.         remove(self);
  341.         return;
  342.     }
  343.  
  344.     damg = 100 + random()*20;
  345.     
  346.     if (other.health)
  347.     {
  348.         if (other.classname == "monster_shambler")
  349.             damg = damg * 0.5;    // mostly immune
  350.         T_Damage (other, self, self.owner, damg );
  351.     }
  352.  
  353.     // don't do radius damage to the other, because all the damage
  354.     // was done in the impact
  355.     T_RadiusDamage (self, self.owner, 120, other);
  356.  
  357. //    sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
  358.     self.origin = self.origin - 8*normalize(self.velocity);
  359.  
  360.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  361.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  362.     WriteCoord (MSG_BROADCAST, self.origin_x);
  363.     WriteCoord (MSG_BROADCAST, self.origin_y);
  364.     WriteCoord (MSG_BROADCAST, self.origin_z);
  365.  
  366.     BecomeExplosion ();
  367.